package _2字符串类;

import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Scanner;
import java.util.UUID;

public class Exercise
{
	
	private final static String[] STR_NUMBER = { "零", "壹", "贰", "叁", "肆", "伍",
			"陆", "柒", "捌", "玖" };
	private final static String[] STR_UNIT = { "", "拾", "佰", "仟", "万", "拾",
			"佰", "仟", "亿", "拾", "佰", "仟" };// 整数单位
	private final static String[] STR_UNIT2 = { "角", "分", "厘" };// 小数单位

	public static void main(String[] args)
	{
		// 1. 字符串"When a man loves a woman,when i wos you man Xman"
		// a. 统计man出现的次数	4次		
		// b. 将所有a替换成X
		// c. 大写方式输出（有方法可以调用，查文档）
		
//		String str1 = "When a man loves a woman,when i wos you man Xman";
//		int count = 0;
//		int index = 0;
//		
//		while(true)
//		{
//			System.out.println("从"+index+"查找");
//	
//			int p = str1.indexOf("man",index);
//			
//			if(p==-1)
//			{
//				System.out.println("后面没有了,总共"+count);
//				break;
//			}
//			else
//			{
//
//				System.out.println("找到位置"+p);
//				// 从找到的位置后面+3位置继续找
//				index =p + 3;
//				count++;
//			}
//		}

		// 2. 产生随机4位验证码,如: 2d6f (由数字、大小写字母构成)
		// 0~9 A-Z a-z 26*2+10
		// 让用户输入验证码
		// 比较用户输入是否正确,显示结果.
		char[] chArr = new char[62];
		for(int i=0;i<26;i++)
		{
			chArr[i] = (char)('a'+i);
			chArr[26+i] = (char)('A'+i);
		}
		for(int i=0;i<10;i++)
		{
			chArr[52+i] = (char)('0' + i);
		}
		System.out.println(Arrays.toString(chArr));
		
		String str = "";
		for(int i=0;i<4;i++)
		{
			str += chArr[(int)(62*Math.random())];
		}
		System.out.println(str);
		
		// 3. "Android iOS Winphone" 得到 删除iOS的字符串
		String strA = "Android iOS Winphone";
		String strNew=strA.replace("iOS", "");
		System.out.println(strNew);

		// 4. "猫抓老鼠，老鼠怕猫" ,将字符串中的猫和老鼠交换
		String strCat = "猫抓老鼠，老鼠怕猫";
		String catNew = strCat.replaceAll("老鼠", "猫");
		String catEnd = catNew.replaceFirst("猫","老鼠");
		catEnd = catEnd.substring(0,7);
		catNew = catEnd.substring(0,2);
		catEnd = catEnd+catNew;
		System.out.println(catEnd);

		// 5. 编写一个方法，将数字转化成中文字符串,比如传入的是12525 ,返回的是"一二五点二五"
		convert(125.25);

		// *6. 编写一个方法，将数字转化成中文金额大写字符串
		// 传入的是125，返回的是"壹佰贰拾伍元整"
		// 传入的是比如125.25，返回的是"壹佰贰拾伍元贰角伍分"
		// 中文大写金额数字应用正楷或行书填写,如壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、 仟、万、亿、元、角、分、零、整(正)等字
		convertCharge(125.5);

		// *6. 编写一个方法，将数字转化成中文金额大写字符串
		// 传入的是125，返回的是"壹佰贰拾伍元整"
		// 传入的是比如125.25，返回的是"壹佰贰拾伍元贰角伍分"
		// 中文大写金额数字应用正楷或行书填写,如壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、 仟、万、亿、元、角、分、零、整(正)等字
		convertCharge(125.5);
	}
	public static String getInteger(String num) {
		if (num.indexOf(".") != -1) { // 判断是否包含小数点
			num = num.substring(0, num.indexOf("."));
		}
		num = new StringBuffer(num).reverse().toString(); // 反转字符串
		StringBuffer temp = new StringBuffer(); // 创建一个StringBuffer对象
		for (int i = 0; i < num.length(); i++) {// 加入单位
			temp.append(STR_UNIT[i]);
			temp.append(STR_NUMBER[num.charAt(i) - 48]);
		}
		num = temp.reverse().toString();// 反转字符串
		num = numReplace(num, "零拾", "零"); // 替换字符串的字符
		num = numReplace(num, "零佰", "零"); // 替换字符串的字符
		num = numReplace(num, "零仟", "零"); // 替换字符串的字符
		num = numReplace(num, "零万", "万"); // 替换字符串的字符
		num = numReplace(num, "零亿", "亿"); // 替换字符串的字符
		num = numReplace(num, "零零", "零"); // 替换字符串的字符
		num = numReplace(num, "亿万", "亿"); // 替换字符串的字符
		// 如果字符串以零结尾将其除去
		if (num.lastIndexOf("零") == num.length() - 1) {
			num = num.substring(0, num.length() - 1);
		}
		return num;
	}


	public static String getDecimal(String num) {
		// 判断是否包含小数点
		if (num.indexOf(".") == -1) {
			return "";
		}
		num = num.substring(num.indexOf(".") + 1);
		// 反转字符串
		num = new StringBuffer(num).reverse().toString();
		// 创建一个StringBuffer对象
		StringBuffer temp = new StringBuffer();
		// 加入单位
		for (int i = 0; i < num.length(); i++) {
			temp.append(STR_UNIT2[i]);
			temp.append(STR_NUMBER[num.charAt(i) - 48]);
		}
		num = temp.reverse().toString(); // 替换字符串的字符
		num = numReplace(num, "零角", "零"); // 替换字符串的字符
		num = numReplace(num, "零分", "零"); // 替换字符串的字符
		num = numReplace(num, "零厘", "零"); // 替换字符串的字符
		num = numReplace(num, "零零", "零"); // 替换字符串的字符
		// 如果字符串以零结尾将其除去
		if (num.lastIndexOf("零") == num.length() - 1) {
			num = num.substring(0, num.length() - 1);
		}
		return num;
	}

	public static String numReplace(String num, String oldStr, String newStr) {
		while (true) {
			// 判断字符串中是否包含指定字符
			if (num.indexOf(oldStr) == -1) {
				break;
			}
			// 替换字符串
			num = num.replaceAll(oldStr, newStr);
		}
		// 返回替换后的字符串
		return num;
	}


	public static void convertCharge(double d) {
		// 实例化DecimalFormat对象
		DecimalFormat df = new DecimalFormat("#0.###");
		// 格式化double数字
		String strNum = df.format(d);
		// 判断是否包含小数点
		if (strNum.indexOf(".") != -1) {
			String num = strNum.substring(0, strNum.indexOf("."));
			// 整数部分大于12不能转换
			if (num.length() > 12) {
				System.out.println("数字太大，不能完成转换！");
			}
		}
		String point = "";// 小数点
		if (strNum.indexOf(".") != -1) {
			point = "元";
		} else {
			point = "元整";
		}
		// 转换结果
		String result = getInteger(strNum) + point + getDecimal(strNum);
		if (result.startsWith("元")) { // 判断是字符串是否已"元"结尾
			result = result.substring(1, result.length()); // 截取字符串
		}
		System.out.println(result);// 返回新的字符串
	}







	// 5. 编写一个方法，将数字转化成中文字符串,比如传入的是12525 ,返回的是"一二五点二五"
	public static void convert(double d){
		Double num = d;
		System.out.println(new Exercise().toChinese(num));
	}



	public static String numToCn(String num) {
		String[] nums = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
		return nums[Integer.parseInt(num)];
	}
	//判断位数
	public StringBuffer leftNumToCn(String leftNum) {
		String[] num = new String[leftNum.length()];
		for (int i = 0; i < leftNum.length(); i++) {
			num[i] = String.valueOf(leftNum.charAt(i));
		}
		//位数标识
		int flag = num.length;
		StringBuffer nums = new StringBuffer();
		if (flag >= 5) {
			nums.append(numToCn(num[flag - 5]));
			nums.append("万");
		}
		if (flag >= 4) {
			nums.append(numToCn(num[flag - 4]));
			nums.append("千");
		}
		if (flag >= 3) {
			nums.append(numToCn(num[flag - 3]));
			nums.append("百");
		}
		if (flag >= 2) {
			nums.append(numToCn(num[flag - 2]));
			nums.append("十");
		}
		if (flag >= 1) {
			nums.append(numToCn(num[flag - 1]));
		}
		return nums;
	}

	//字符拼接
	public String toChinese(Object n) {
		String changeNum = String.valueOf(n);
		String[] strings = changeNum.split("\\.");
		return leftNumToCn(strings[0]) + "点" + rightNum(strings[1]);
	}


	public StringBuffer rightNum(String rightNum) {
		StringBuffer nums = new StringBuffer();
		for (int i = 0; i < rightNum.length(); i++) {
			nums.append(numToCn(String.valueOf(rightNum.charAt(i))));
		}
		return nums;
	}






	private static String decisionVerificationCode() {
		String str3 = randomA();	
		System.out.println("验证码为:"+str3);
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入验证码");
		String str4 = sc.next();
		if(str4.equals(str3)) {
			return "验证码输入正确";
		}else {
			return "验证码输入错误";
		}
	}





	private static String randomA() {
		int n = 1;//需要生成几位
		//最终生成的字符串
        String str = "";
        for (int i = 0; i < n; i++) {
            str = str + (char)(Math.random()*26+'a');
        } 
        UUID uuid = UUID.randomUUID();
		String str3=uuid.toString();
		String str4 = str.toUpperCase();
		str3 = str3.substring(0,3);
		str3 = str4+str3;
        
        return str3;
    }
	
	
	
	
	
	private static int hit(String a, String b) {
		if(a.length()<b.length()) {
			return 0;
		}else {
			int count = 0;
			char[] chr = a.toCharArray(); 
			
			for(int i=0;i<a.length()-b.length();i++) {			
				i =a.indexOf(b,i)+1;
				count ++;
			}
			return count;
			
			
		}
	}

}
